import {Injectable} from '@angular/core';

import {Constant} from '@core/constant';
import {HttpServer} from '@core/net/http-server';
import {UrlManager} from '@shared/url/url.manager';

import {Observable, Observer, of} from 'rxjs';
import {tap} from 'rxjs/operators';

import {PageInfo} from '@core/model/pageInfo';
import {Menu} from '../model/menu';

@Injectable()
export class MenuService {

  constructor(
    private http: HttpServer
  ) {
  }

  private data: Menu[] = [];

  private _tid: string;

  private menuList: Menu[] = [];

  get menus() {
    return this.data;
  }

  get tid(): string {
    return this._tid;
  }

  setMenus(menus: Menu[]): void {
    this.data = menus;
  }

  setTid(id: string): void {
    this._tid = id;
  }

  // getMemuByUrl(url): Menu {
  //   let arr = [{
  //     id: '0',
  //     name: '桌面',
  //     url: '/main/dashboard',
  //     mDesc: '',
  //     dept: 1
  //   }];
  //   if (this.menuList.length > 1) {
  //     arr = this.menuList;
  //   } else {
  //     this.data.forEach((item) => {
  //       if (item.menuFunctionChilders && item.menuFunctionChilders.length > 0) {
  //         item.menuFunctionChilders.forEach((val) => {
  //           arr.push(val);
  //         })
  //       } else {
  //         arr.push(item);
  //       }
  //     });
  //     this.menuList = arr;
  //   }
  //   return arr.find((w) => { return w.url === url });
  // }
  //
  // getMenus(): Observable<Menu[]> {
  //   if (localStorage.get(Constant.MENU_KEY)) {
  //     return Observable.create(localStorage.get(Constant.MENU_KEY));
  //   } else {
  //     return this.http.get<Menu[]>(UrlManager.menu.getMenuUrl, {})
  //     .pipe(
  //       tap(data => {
  //         console.log(data);
  //       })
  //     );
  //   }
  // }
  //
  getAllMenusByPage(pageNo: number, pageSize: number): Observable<PageInfo<Menu>> {
    return this.http.get(UrlManager.menu.getMenuFunctionListUrl, {
      pageNo: pageNo,
      pageSize: pageSize
    });
  }

  getMenuByPage(pageNo: number, pageSize: number, type: number, name?: string): Observable<PageInfo<Menu>> {
    if (name !== '') {
      return this.getMenuByNameOrPid(pageNo, pageSize, name);
    } else {
      return this.http.get<PageInfo<Menu>>(UrlManager.menu.getMenuPageByTypeUrl, {
        pageNo: pageNo,
        pageSize: pageSize,
        type: type
      });
    }
  }


  getMenuByPageWithRole(pageNo: number, pageSize: number, roleId: number): Observable<PageInfo<Menu>> {
    return this.http.get(UrlManager.menu.getMenuByPageWithRoleUrl, {
      pageNo: pageNo,
      pageSize: pageSize,
      roleId: roleId
    });
  }

  //
  getMenuById(id: string): Observable<Menu> {
    return this.http.get(UrlManager.menu.getMenuByIdUrl, {
      id: id
    });
  }

  //
  getMenuByNameOrPid(pageNo: number, pageSize: number, name: string, pid?: number): Observable<PageInfo<Menu>> {
    return this.http.get(UrlManager.menu.getMenuByNameOrPidUrl, {
      pageNo: pageNo,
      pageSize: pageSize,
      name: name,
      pid: pid
    });
  }

  //
  //
  //
  addMenu(item: Menu): Observable<Menu> {
    return this.http.post(UrlManager.menu.addMenuUrl, item);
  }

  //
  updateMenu(item: Menu): Observable<boolean> {
    return this.http.post(UrlManager.menu.updateMenuUrl, item);
  }

  deltetMenu(id: string): Observable<boolean> {
    return this.http.get(UrlManager.menu.deleteMenuUrl, {
      id: id
    });
  }

  refreshAuthority(): Observable<boolean> {
    return this.http.get(UrlManager.menu.refreshAuthority, {});
  }
}
